package token

import (
	"context"

	"github.com/go-playground/validator/v10"
	"github.com/infraboard/mcube/v2/ioc"
)

var (
	v = validator.New()
)

type Service interface {
	UserService
	InnerService
}

const AppName = "token"

func GetService() Service {
	return ioc.Controller().Get(AppName).(Service)
}

// 外部功能
type UserService interface {
	// 颁发令牌 --> 登录
	IssueToken(context.Context, *IssueTokenRequest) (*Token, error)
	// 撤销令牌 --> 登出
	RevolkToken(context.Context, *RevolkTokenRequest) (*Token, error)
}

func NewIssueTokenRequest(username, password string) *IssueTokenRequest {
	return &IssueTokenRequest{
		UserName: username,
		Password: password,
	}
}

func (t *IssueTokenRequest) Validate() error {
	return v.Struct(t)
}

type IssueTokenRequest struct {
	UserName string `json:"user_name" validate:"required"`
	Password string `json:"password" validate:"required"`
	// 是否记住本次登录信息，如果需要 token 会保存七天，如果不需要 token 一天会过期
	RememberMe bool `json:"remember_me"`
}
type RevolkTokenRequest struct {
	// 访问令牌
	AccessToken string `json:"access_token"`
	// 刷新令牌，构成一对，避免 AccessToken 泄露，用户可以直接 revolk
	RefreshToken string `json:"refresh_token"`
}

// 内部功能
type InnerService interface {
	// 令牌校验
	ValidateToken(context.Context, *ValidateTokenRequest) (*Token, error)
}

func NewValidateTokenRequest(at string) *ValidateTokenRequest {
	return &ValidateTokenRequest{
		AccessToken: at,
	}
}

type ValidateTokenRequest struct {
	// 访问令牌
	AccessToken string `json:"access_token"`
}
